/*
 * SoftwareSAR - 1.0
 */
package br.com.cpqd.ssar.geradormalha;

import br.com.cpqd.ssar.mediador.RequisicaoServicos;
import br.com.cpqd.ssar.utilitarias.Material;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Vector;

/**
 * Classe que Salva em Disco a Malha 3D do FDTD
 * @author Rafael Buck
 * @version 1.2
 */
public class ExportadorMalhaFDTD {

    /**
     * Grava Arquivo da Malha FDTD 3D em Disco
     * @param requisicaoServicos RequisicaoServicos
     * @param malha GeradorMalhaFDTD
     * @return boolean indicando se o arquivo foi gravado com sucesso
     */
    public boolean exportMeshFDTD(RequisicaoServicos requisicaoServicos, GeradorMalhaFDTD malha) {

        Vector listaMaterial = new Vector();
        int idMaterial;

        // Coordenadas Espaciais
        float x, y, z;

        // Exporta Arquivo de Malha (Materiais)
        try {
            FileWriter writer = new FileWriter(requisicaoServicos.obterNomeArquivoMalhaFDTD());
            PrintWriter pw = new PrintWriter(new BufferedWriter(writer));
            for (int i = 0; i < malha.getNx(); i++) {
                for (int j = 0; j < malha.getNy(); j++) {
                    for (int k = 0; k < malha.getNz(); k++) {
                        idMaterial = malha.obterMaterialCubo(i, j, k);
                        pw.println(i + " " + j + " " + k + " " + idMaterial);
                        if (!listaMaterial.contains(idMaterial)) {
                            listaMaterial.add(idMaterial);
                        }
                    }
                }
            }
            pw.close();
            writer.close();
        } catch (IOException e) {
            System.out.println("ExportadorMalhaFDTD: Erro ao gravar o arquivo da malha gerada");
            return false;
        }
        System.out.println("ExportadorMalhaFDTD: Arquivo da malha gerada foi gravado com sucesso");

//        // Exporta Arquivo de Malha (Coordenadas)
//        try {
//            FileWriter writer = new FileWriter(caminhoMalha + File.separator + "br_fdtd_coordinates.txt");
//            PrintWriter pw = new PrintWriter(new BufferedWriter(writer));
//            for (int i = 0; i < malha.getNx(); i++) {
//                for (int j = 0; j < malha.getNy(); j++) {
//                    for (int k = 0; k < malha.getNz(); k++) {
//                        x = (malha.getXMin() + i * malha.getDx()) + (malha.getDx() * 0.5f);
//                        y = (malha.getYMin() + j * malha.getDy()) + (malha.getDy() * 0.5f);
//                        z = (malha.getZMin() + k * malha.getDz()) + (malha.getDz() * 0.5f);
//                        pw.println(x + " " + y + " " + z);
//                    }
//                }
//            }
//            pw.close();
//            writer.close();
//        } catch (IOException e) {
//            System.out.println("ExportadorMalhaFDTD: Erro ao gravar br_fdtd_coordinates.txt");
//            return false;
//        }
//        System.out.println("ExportadorMalhaFDTD: br_fdtd_coordinates.txt foi gravado com sucesso");

        // Exporta Arquivo de Malha (Coordenadas)
        try {
            FileWriter writer = new FileWriter(requisicaoServicos.obterNomeArquivoDeltasFDTD());
            PrintWriter pw = new PrintWriter(new BufferedWriter(writer));
            pw.println(malha.getNx() + " " + malha.getNy() + " " + malha.getNz());
            pw.println(malha.getDx() + " " + malha.getDy() + " " + malha.getDz());
            pw.println(requisicaoServicos.getUnidadeDimensional());
//            pw.println(malha.getXMin() + " " + malha.getYMin() + " " + malha.getZMin());
//            pw.println(malha.getXMax() + " " + malha.getYMax() + " " + malha.getZMax());
            pw.close();
            writer.close();
        } catch (IOException e) {
            System.out.println("ExportadorMalhaFDTD: Erro ao gravar o arquivo de deltas da materiais gerada");
            return false;
        }
        System.out.println("ExportadorMalhaFDTD: Arquivo de deltas da malha gerada foi gravado com sucesso");

        String cabecalho1 = "/** Sequencia dos valores:";
        String cabecalho2 = "/** id / permissividade / permeabilidade / condutividade / perda magnetica / densidade especifica / nome / cor: R G B";
        // Exporta Arquivo de Malha (Materiais)
        try {
            FileWriter writer = new FileWriter(requisicaoServicos.obterNomeArquivoMateriaisFDTD());
            PrintWriter pw = new PrintWriter(new BufferedWriter(writer));

            // Imprime Primeiro Cabeçalho
            pw.println(cabecalho1);
            // Imprime Segundo Cabeçalho
            pw.println(cabecalho2);

            int i = 0;
            while (i < listaMaterial.size()) {
                int id = Integer.parseInt(listaMaterial.elementAt(i).toString());
                Material material = requisicaoServicos.obterMaterial(id);                
                pw.print(String.valueOf(material.getId()));
                pw.print("\t" + String.valueOf(material.getPermissividade()));
                pw.print("\t" + String.valueOf(material.getPermeabilidade()));
                pw.print("\t" + String.valueOf(material.getCondutividade()));
                pw.print("\t" + String.valueOf(material.getPerdaMagnetica()));
                pw.print("\t" + String.valueOf(material.getDensidadeEspecifica()));
                pw.print("\t" + String.valueOf(material.getNome()));
                pw.print("\t" + String.valueOf(material.getCor().getRed()));
                pw.print("\t" + String.valueOf(material.getCor().getGreen()));
                pw.println("\t" + String.valueOf(material.getCor().getBlue()));
                i++;
            }

            pw.close();
            writer.close();
        } catch (IOException e) {
            System.out.println("ExportadorMalhaFDTD: Erro ao gravar o arquivo da materiais gerada");
            return false;
        }
        System.out.println("ExportadorMalhaFDTD: Arquivo da materiais gerada foi gravado com sucesso");

        // Foi Gravado com Sucesso
        return true;
    }
}
